#include "jserver.h"
#include <QDateTime>

JServer::JServer(QObject *parent) :
        QTcpServer(parent)
{
    this->startTimer(1000);

}

JServer::~JServer()
{
    this->close();
}

void JServer::incomingConnection(int handle)
{
    JConn *newconn = new JConn(this);
    newconn->setSocketDescriptor(handle);
    int i=0;
    for(i=0;i<clientList.size();i++)
    {
        if(clientList[i]->info.hostaddr==newconn->peerAddress())
        {
            delete clientList[i];
            clientList[i] = newconn;
            emit oldconnection(i);
            break;
        }
    }
    if(i==clientList.size())
    {
        clientList.push_back(newconn);
        emit newConnection();
    }

}

void JServer::Cal_data()
{
    int i=0;
    data=data1;
    data.onlineHostNum=0;
    for(i=0;i<clientList.size();i++)
    {
        if(clientList[i]->info.state)
        {
            data.onlineHostNum++;

            data.cpu.user.average += clientList[i]->info.cpu.user;
            data.cpu.system.average += clientList[i]->info.cpu.system;
            data.cpu.idle.average += clientList[i]->info.cpu.idle;
            data.cpu.wait.average += clientList[i]->info.cpu.wait;
            data.cpu.nice.average += clientList[i]->info.cpu.nice;

            data.mem.used.average += clientList[i]->info.mem.used;
            data.mem.cached.average += clientList[i]->info.mem.cached;
            data.mem.buffered.average += clientList[i]->info.mem.bufferd;
            data.mem.shared.average += clientList[i]->info.mem.shared;
            data.mem.swapped.average += clientList[i]->info.mem.swapped;

            data.temperature.temp.average += clientList[i]->info.temp.temp;

            data.traffic.in.average += clientList[i]->info.traffic.in;
            data.traffic.out.average += clientList[i]->info.traffic.out;

            if(data.cpu.idle.max.data==-1)
            {
                data.cpu.idle.max.data=clientList[i]->info.cpu.idle;
                data.cpu.idle.max.node_id=i;
            }
            else if(data.cpu.idle.max.data < clientList[i]->info.cpu.idle)
            {
                data.cpu.idle.max.data=clientList[i]->info.cpu.idle;
                data.cpu.idle.max.node_id=i;
            }
            if(data.cpu.nice.max.data==-1)
            {
                data.cpu.nice.max.data=clientList[i]->info.cpu.nice;
                data.cpu.nice.max.node_id=i;
            }
            else if(data.cpu.nice.max.data < clientList[i]->info.cpu.nice)
            {
                data.cpu.nice.max.node_id=i;
                data.cpu.nice.max.data=clientList[i]->info.cpu.nice;
            }
            if(data.cpu.system.max.data==-1)
            {
                data.cpu.system.max.data=clientList[i]->info.cpu.system;
                data.cpu.system.max.node_id=i;
            }
            else if(data.cpu.system.max.data < clientList[i]->info.cpu.system)
            {
                data.cpu.system.max.data=clientList[i]->info.cpu.system;
                data.cpu.system.max.node_id=i;
            }
            if(data.cpu.user.max.data==-1)
            {
                data.cpu.user.max.data=clientList[i]->info.cpu.user;
                data.cpu.user.max.node_id=i;
            }
            else if(data.cpu.user.max.data < clientList[i]->info.cpu.user)
            {
                data.cpu.user.max.data=clientList[i]->info.cpu.user;
                data.cpu.user.max.node_id=i;
            }
            if(data.cpu.wait.max.data==-1)
            {
                data.cpu.wait.max.data=clientList[i]->info.cpu.wait;
                data.cpu.wait.max.node_id=i;
            }
            else if(data.cpu.wait.max.data < clientList[i]->info.cpu.wait)
            {
                data.cpu.wait.max.data=clientList[i]->info.cpu.wait;
                data.cpu.wait.max.node_id=i;
            }

            if(data.mem.buffered.max.data==-1)
            {
                data.mem.buffered.max.data=clientList[i]->info.mem.bufferd;
                data.mem.buffered.max.node_id=i;
            }
            else if(data.mem.buffered.max.data < clientList[i]->info.mem.bufferd)
            {
                data.mem.buffered.max.data=clientList[i]->info.mem.bufferd;
                data.mem.buffered.max.node_id=i;
            }
            if(data.mem.cached.max.data==-1)
            {
                data.mem.cached.max.data=clientList[i]->info.mem.cached;
                data.mem.cached.max.node_id=i;
            }
            else if(data.mem.cached.max.data < clientList[i]->info.mem.cached)
            {
                data.mem.cached.max.data=clientList[i]->info.mem.cached;
                data.mem.cached.max.node_id=i;
            }
            if(data.mem.shared.max.data==-1)
            {
                data.mem.shared.max.data=clientList[i]->info.mem.shared;
                data.mem.shared.max.node_id=i;
            }
            else if(data.mem.shared.max.data < clientList[i]->info.mem.shared)
            {
                data.mem.shared.max.data=clientList[i]->info.mem.shared;
                data.mem.shared.max.node_id=i;
            }
            if(data.mem.swapped.max.data==-1)
            {
                data.mem.swapped.max.data=clientList[i]->info.mem.swapped;
                data.mem.swapped.max.node_id=i;
            }
            else if(data.mem.swapped.max.data < clientList[i]->info.mem.swapped)
            {
                data.mem.swapped.max.data=clientList[i]->info.mem.swapped;
                data.mem.swapped.max.node_id=i;
            }
            if(data.mem.used.max.data==-1)
            {
                data.mem.used.max.data=clientList[i]->info.mem.used;
                data.mem.used.max.node_id=i;
            }
            else if(data.mem.used.max.data < clientList[i]->info.mem.used)
            {
                data.mem.used.max.data=clientList[i]->info.mem.used;
                data.mem.used.max.node_id=i;
            }

            if(data.temperature.temp.max.data==-1)
            {
                data.temperature.temp.max.data=clientList[i]->info.temp.temp;
                data.temperature.temp.max.node_id=i;
            }
            else if(data.temperature.temp.max.data < clientList[i]->info.temp.temp)
            {
                data.temperature.temp.max.data=clientList[i]->info.temp.temp;
                data.temperature.temp.max.node_id=i;
            }

            if(data.traffic.in.max.data==-1)
            {
                data.traffic.in.max.data=clientList[i]->info.traffic.in;
                data.traffic.in.max.node_id=i;
            }
            else if(data.traffic.in.max.data < clientList[i]->info.traffic.in)
            {
                data.traffic.in.max.data=clientList[i]->info.traffic.in;
                data.traffic.in.max.node_id=i;
            }
            if(data.traffic.out.max.data==-1)
            {
                data.traffic.out.max.data=clientList[i]->info.traffic.out;
                data.traffic.out.max.node_id=i;
            }
            else if(data.traffic.out.max.data < clientList[i]->info.traffic.out)
            {
                data.traffic.out.max.data=clientList[i]->info.traffic.out;
                data.traffic.out.max.node_id=i;
            }



            if(data.cpu.idle.min.data==-1)
            {
                data.cpu.idle.min.data=clientList[i]->info.cpu.idle;
                data.cpu.idle.min.node_id=i;
            }
            else if(data.cpu.idle.min.data >= clientList[i]->info.cpu.idle)
            {
                data.cpu.idle.min.data=clientList[i]->info.cpu.idle;
                data.cpu.idle.min.node_id=i;
            }
            if(data.cpu.nice.min.data==-1)
            {
                data.cpu.nice.min.data=clientList[i]->info.cpu.nice;
                data.cpu.nice.min.node_id=i;
            }
            else if(data.cpu.nice.min.data >= clientList[i]->info.cpu.nice)
            {
                data.cpu.nice.min.node_id=i;
                data.cpu.nice.min.data=clientList[i]->info.cpu.nice;
            }
            if(data.cpu.system.min.data==-1)
            {
                data.cpu.system.min.data=clientList[i]->info.cpu.system;
                data.cpu.system.min.node_id=i;
            }
            else if(data.cpu.system.min.data >= clientList[i]->info.cpu.system)
            {
                data.cpu.system.min.data=clientList[i]->info.cpu.system;
                data.cpu.system.min.node_id=i;
            }
            if(data.cpu.user.min.data==-1)
            {
                data.cpu.user.min.data=clientList[i]->info.cpu.user;
                data.cpu.user.min.node_id=i;
            }
            else if(data.cpu.user.min.data >= clientList[i]->info.cpu.user)
            {
                data.cpu.user.min.data=clientList[i]->info.cpu.user;
                data.cpu.user.min.node_id=i;
            }
            if(data.cpu.wait.min.data==-1)
            {
                data.cpu.wait.min.data=clientList[i]->info.cpu.wait;
                data.cpu.wait.min.node_id=i;
            }
            else if(data.cpu.wait.min.data >= clientList[i]->info.cpu.wait)
            {
                data.cpu.wait.min.data=clientList[i]->info.cpu.wait;
                data.cpu.wait.min.node_id=i;
            }

            if(data.mem.buffered.min.data==-1)
            {
                data.mem.buffered.min.data=clientList[i]->info.mem.bufferd;
                data.mem.buffered.min.node_id=i;
            }
            else if(data.mem.buffered.min.data >= clientList[i]->info.mem.bufferd)
            {
                data.mem.buffered.min.data=clientList[i]->info.mem.bufferd;
                data.mem.buffered.min.node_id=i;
            }
            if(data.mem.cached.min.data==-1)
            {
                data.mem.cached.min.data=clientList[i]->info.mem.cached;
                data.mem.cached.min.node_id=i;
            }
            else if(data.mem.cached.min.data >= clientList[i]->info.mem.cached)
            {
                data.mem.cached.min.data=clientList[i]->info.mem.cached;
                data.mem.cached.min.node_id=i;
            }
            if(data.mem.shared.min.data==-1)
            {
                data.mem.shared.min.data=clientList[i]->info.mem.shared;
                data.mem.shared.min.node_id=i;
            }
            else if(data.mem.shared.min.data >= clientList[i]->info.mem.shared)
            {
                data.mem.shared.min.data=clientList[i]->info.mem.shared;
                data.mem.shared.min.node_id=i;
            }
            if(data.mem.swapped.min.data==-1)
            {
                data.mem.swapped.min.data=clientList[i]->info.mem.swapped;
                data.mem.swapped.min.node_id=i;
            }
            else if(data.mem.swapped.min.data >= clientList[i]->info.mem.swapped)
            {
                data.mem.swapped.min.data=clientList[i]->info.mem.swapped;
                data.mem.swapped.min.node_id=i;
            }
            if(data.mem.used.min.data==-1)
            {
                data.mem.used.min.data=clientList[i]->info.mem.used;
                data.mem.used.min.node_id=i;
            }
            else if(data.mem.used.min.data >= clientList[i]->info.mem.used)
            {
                data.mem.used.min.data=clientList[i]->info.mem.used;
                data.mem.used.min.node_id=i;
            }

            if(data.temperature.temp.min.data==-1)
            {
                data.temperature.temp.min.data=clientList[i]->info.temp.temp;
                data.temperature.temp.min.node_id=i;
            }
            else if(data.temperature.temp.min.data >= clientList[i]->info.temp.temp)
            {
                data.temperature.temp.min.data=clientList[i]->info.temp.temp;
                data.temperature.temp.min.node_id=i;
            }

            if(data.traffic.in.min.data==-1)
            {
                data.traffic.in.min.data=clientList[i]->info.traffic.in;
                data.traffic.in.min.node_id=i;
            }
            else if(data.traffic.in.min.data >= clientList[i]->info.traffic.in)
            {
                data.traffic.in.min.data=clientList[i]->info.traffic.in;
                data.traffic.in.min.node_id=i;
            }
            if(data.traffic.out.min.data==-1)
            {
                data.traffic.out.min.data=clientList[i]->info.traffic.out;
                data.traffic.out.min.node_id=i;
            }
            else if(data.traffic.out.min.data >= clientList[i]->info.traffic.out)
            {
                data.traffic.out.min.data=clientList[i]->info.traffic.out;
                data.traffic.out.min.node_id=i;
            }
        }
    }
    if(data.onlineHostNum>0)
    {
        data.cpu.user.average /= data.onlineHostNum;
        data.cpu.system.average /= data.onlineHostNum;
        data.cpu.idle.average /= data.onlineHostNum;
        data.cpu.wait.average /= data.onlineHostNum;
        data.cpu.nice.average /= data.onlineHostNum;

        data.mem.used.average /= data.onlineHostNum;
        data.mem.cached.average /= data.onlineHostNum;
        data.mem.buffered.average /= data.onlineHostNum;
        data.mem.shared.average /= data.onlineHostNum;
        data.mem.swapped.average /= data.onlineHostNum;

        data.temperature.temp.average /= data.onlineHostNum;

        data.traffic.in.average /= data.onlineHostNum;
        data.traffic.out.average /= data.onlineHostNum;
    }
}

void JServer::timerEvent(QTimerEvent *)
{
    this->Cal_data();
}

